package com.duoduo.剑指Offer;

/**
 * @program: algorithm
 * @description: 机器人的运动范围30
 * 地上有一个m行n列的方格，从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动，它每次可以向左、右、上、下移动一格（不能移动到方格外），也不能进入行坐标和列坐标的数位之和大于k的格子。例如，当k为18时，机器人能够进入方格 [35, 37] ，因为3+5+3+7=18。但它不能进入方格 [35, 38]，因为3+5+3+8=19。请问该机器人能够到达多少个格子？
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：m = 2, n = 3, k = 1
 * 输出：3
 * @author: chaidl  ！
 * @create: 2022-05-26 20:54
 */
public class 机器人的运动范围30 {
	public int movingCount(int m, int n, int k) {
		//标注当前棋盘有没有被访问过
		boolean[][] visited = new boolean[m][n];
		//从左上角开始寻找
		return dfs(0, 0, m, n, k, visited);
	}
	private int dfs(int x, int y, int m, int n, int k, boolean[][] visited) {
		if (x < 0 || x >= m || y < 0 || y >= n || (x/10 + x%10 + y/10 + y%10) > k || visited[x][y]) {
			return 0;
		}
		//表示当前位置已经被访问过了
		visited[x][y] = true;
		//从上下左右开始走
		return 1+dfs(x + 1, y, m, n, k, visited) +
				dfs(x - 1, y, m, n, k, visited) +
				dfs(x, y + 1, m, n, k, visited) +
				dfs(x, y - 1, m, n, k, visited);
	}
	
}
